package com.java.socket.tcp.multiclient.whileloop.server;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 多客户端Socket情况下的Socket服务端.
 * <p>使用while死循环的方式，另一种是使用多线程或者线程池的方式</p>
 *
 * @author xzmeasy
 * @version 1.0
 * @since 星期一 十二月,2018
 */
@SuppressWarnings("Duplicates")
public class ServerSocketExample {

    public static void main(String[] args) {
        try {
            // 创建服务段Socket，监听指定端口
            ServerSocket serverSocket = new ServerSocket(8888);
            System.out.println("服务端Socket启动...");
            while (true) {
                // 侦听连接此服务端的客户端连接并接受它，该方法会阻塞连接
                Socket socket = serverSocket.accept();
                // 创建输入流，并接收从客户端发送过来的消息
                InputStream inputStream = socket.getInputStream();
                byte[] bytes = new byte[1024];
                int len;
                StringBuilder sb = new StringBuilder();
                while ((len = inputStream.read(bytes)) != -1) {
                    // 注意指定编码格式，发送方和接收方一定要统一，建议使用UTF-8
                    sb.append(new String(bytes, 0, len, "UTF-8"));
                }
                System.out.println("从客户端接收到的消息: " + sb.toString());


                // 向客户端发送反馈信息
                OutputStream outputStream = socket.getOutputStream();
                PrintWriter printWriter = new PrintWriter(outputStream);
                String message = "来自服务端的反馈信息...";
                printWriter.write(message);
                printWriter.flush();


                // 关闭资源
                printWriter.close();
                outputStream.close();
                inputStream.close();
                socket.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
